package com.moutai.wmo.core.mybatis.TypeHandler;

import lombok.extern.slf4j.Slf4j;
import org.apache.ibatis.type.JdbcType;
import org.apache.ibatis.type.BaseTypeHandler;

import java.sql.ResultSet;
import java.sql.SQLException;
import java.sql.CallableStatement;
import java.sql.PreparedStatement;

/**
 * 对应数据库字段类型char(10)，
 * StringTypeHandler返回的结果为 : "admin     " ，
 * 但实际上想要的可能是           : "admin" ，
 * 这就需要trim一下。
 * tip: 其实把char(10)换为varchar(10)就行了。
 */
@Slf4j
public class TrimStringTypeHandler extends BaseTypeHandler<String> {
    /**
     * 向PreparedStatement中设置非空参数（准备向数据库传送sql语句）
     */
    @Override
    public void setNonNullParameter(PreparedStatement ps, int i, String parameter, JdbcType jdbcType) throws SQLException {
        //log.info("setNonNullParameter(PreparedStatement = {}, int = {}, String = {}, JdbcType = {})", ps, i, parameter, jdbcType);
        ps.setString(i, parameter);
    }

    /**
     * 用字段名称从ResultSet中，获取可能为空的结果（获取并处理数据库返回数据）
     * !!!在使用TypeHandler的时候需要指定autoResultMap为true，否则无效!!!
     */
    @Override
    public String getNullableResult(ResultSet rs, String columnName) throws SQLException {
        //log.info("1. 用字段名称从ResultSet中，获取可能为空的结果，ResultSet = {}, columnName = {}", rs, columnName);
        return rs.getString(columnName).trim();
    }

    /**
     * 用字段所在序号从ResultSet中，获取可能为空的结果（获取并处理数据库返回数据）
     * !!!在使用TypeHandler的时候需要指定autoResultMap为true，否则无效!!!
     */
    @Override
    public String getNullableResult(ResultSet rs, int columnIndex) throws SQLException {
        //log.info("2. 用字段所在序号从ResultSet中，获取可能为空的结果，ResultSet = {}, columnIndex = {}", rs, columnIndex);
        return rs.getString(columnIndex).trim();
    }

    /**
     * 用字段所在序号从CallableStatement中，获取可能为空的结果（获取并处理数据库返回数据）
     * !!!在使用TypeHandler的时候需要指定autoResultMap为true，否则无效!!!
     */
    @Override
    public String getNullableResult(CallableStatement cs, int columnIndex) throws SQLException {
        //log.info("3. 用字段所在序号从CallableStatement中，获取可能为空的结果，CallableStatement = {}, columnIndex = {}", cs, columnIndex);
        return cs.getString(columnIndex).trim();
    }
}
